/*- Private Functions -*/

#include <compactsufsort/compactsufsort.hpp>
#include <compactsufsort/divsufsort_private.h>

namespace compactsufsort_imp {
const saint_t lg_table[256]= {
 -1,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
};

// #if (SS_BLOCKSIZE == 0) || (SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE)

// saint_t
// ss_ilg(saidx_t n) {
// #if SS_BLOCKSIZE == 0
// # if defined(BUILD_DIVSUFSORT64)
//   return (n >> 32) ?
//           ((n >> 48) ?
//             ((n >> 56) ?
//               56 + lg_table[(n >> 56) & 0xff] :
//               48 + lg_table[(n >> 48) & 0xff]) :
//             ((n >> 40) ?
//               40 + lg_table[(n >> 40) & 0xff] :
//               32 + lg_table[(n >> 32) & 0xff])) :
//           ((n & 0xffff0000) ?
//             ((n & 0xff000000) ?
//               24 + lg_table[(n >> 24) & 0xff] :
//               16 + lg_table[(n >> 16) & 0xff]) :
//             ((n & 0x0000ff00) ?
//                8 + lg_table[(n >>  8) & 0xff] :
//                0 + lg_table[(n >>  0) & 0xff]));
// # else
//   return (n & 0xffff0000) ?
//           ((n & 0xff000000) ?
//             24 + lg_table[(n >> 24) & 0xff] :
//             16 + lg_table[(n >> 16) & 0xff]) :
//           ((n & 0x0000ff00) ?
//              8 + lg_table[(n >>  8) & 0xff] :
//              0 + lg_table[(n >>  0) & 0xff]);
// # endif
// #elif SS_BLOCKSIZE < 256
//   return lg_table[n];
// #else
//   return (n & 0xff00) ?
//           8 + lg_table[(n >> 8) & 0xff] :
//           0 + lg_table[(n >> 0) & 0xff];
// #endif
// }

// #endif /* (SS_BLOCKSIZE == 0) || (SS_INSERTIONSORT_THRESHOLD < SS_BLOCKSIZE) */

#if SS_BLOCKSIZE != 0

const saint_t sqq_table[256] = {
  0,  16,  22,  27,  32,  35,  39,  42,  45,  48,  50,  53,  55,  57,  59,  61,
 64,  65,  67,  69,  71,  73,  75,  76,  78,  80,  81,  83,  84,  86,  87,  89,
 90,  91,  93,  94,  96,  97,  98,  99, 101, 102, 103, 104, 106, 107, 108, 109,
110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155,
156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168,
169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180,
181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191,
192, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201,
202, 203, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211,
212, 212, 213, 214, 214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 221,
221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230,
230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238,
239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247,
247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255
};

// saidx_t
// ss_isqrt(saidx_t x) {
//   saidx_t y, e;

//   if(x >= (SS_BLOCKSIZE * SS_BLOCKSIZE)) { return SS_BLOCKSIZE; }
//   e = (x & 0xffff0000) ?
//         ((x & 0xff000000) ?
//           24 + lg_table[(x >> 24) & 0xff] :
//           16 + lg_table[(x >> 16) & 0xff]) :
//         ((x & 0x0000ff00) ?
//            8 + lg_table[(x >>  8) & 0xff] :
//            0 + lg_table[(x >>  0) & 0xff]);

//   if(e >= 16) {
//     y = sqq_table[x >> ((e - 6) - (e & 1))] << ((e >> 1) - 7);
//     if(e >= 24) { y = (y + 1 + x / y) >> 1; }
//     y = (y + 1 + x / y) >> 1;
//   } else if(e >= 8) {
//     y = (sqq_table[x >> ((e - 6) - (e & 1))] >> (7 - (e >> 1))) + 1;
//   } else {
//     return sqq_table[x] >> 4;
//   }

//   return (x < (y * y)) ? y - 1 : y;
// }

#endif /* SS_BLOCKSIZE != 0 */


/*---------------------------------------------------------------------------*/

} // namespace compactsufsort_imp
